package com.mkx.samples;

import com.mkx.spi.LoggingService;
import java.util.ServiceLoader;

/**
 * SPI设计模式演示类
 * 展示如何使用Java SPI机制加载和使用服务实现
 */
public class SPIDemo {
    
    /**
     * 主方法，演示SPI的使用
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 使用ServiceLoader加载所有实现了LoggingService接口的服务提供者
        // ServiceLoader会自动扫描META-INF/services/com.mkx.spi.LoggingService文件
        // 并加载文件中指定的所有实现类
        ServiceLoader<LoggingService> serviceLoader = ServiceLoader.load(LoggingService.class);
        
        System.out.println("====== Java SPI 设计模式演示 ======");
        System.out.println("发现的日志服务实现：");
        
        // 遍历所有加载的服务实现
        int serviceCount = 0;
        for (LoggingService loggingService : serviceLoader) {
            serviceCount++;
            System.out.println("\n--- 服务 " + serviceCount + ": " + loggingService.getServiceName() + " ---");
            
            // 测试日志服务的功能
            loggingService.logInfo("这是一条信息日志，使用" + loggingService.getServiceName());
            loggingService.logError("这是一条错误日志，使用" + loggingService.getServiceName(), 
                                    new RuntimeException("模拟异常"));
        }
        
        System.out.println("\n====== SPI演示完成 ======");
        System.out.println("总共发现并加载了 " + serviceCount + " 个日志服务实现");
        
        // 演示如何获取特定的服务实现
        System.out.println("\n====== 获取特定服务实现演示 ======");
        LoggingService consoleService = findServiceByName("ConsoleLoggingService");
        if (consoleService != null) {
            consoleService.logInfo("成功找到并使用ConsoleLoggingService");
        }
        
        LoggingService fileService = findServiceByName("FileLoggingService");
        if (fileService != null) {
            fileService.logInfo("成功找到并使用FileLoggingService");
        }
    }
    
    /**
     * 根据服务名称查找特定的服务实现
     * @param serviceName 服务名称
     * @return 找到的服务实现，如果没有找到则返回null
     */
    private static LoggingService findServiceByName(String serviceName) {
        ServiceLoader<LoggingService> serviceLoader = ServiceLoader.load(LoggingService.class);
        for (LoggingService service : serviceLoader) {
            if (serviceName.equals(service.getServiceName())) {
                return service;
            }
        }
        return null;
    }
}